home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_400 / 422_02 / misc / bitarray.c < prev    next >
C/C++ Source or Header  |  1994-03-20  |  2KB  |  67 lines

  1. /*
  2.  * Example of defining and using an array of bits in 'C'.
  3.  *
  4.  * Usually, if you have a small array of TRUE/FALSE flags, it easiest
  5.  * to use an array of 'char', since the code necessary to access bits
  6.  * will likely take up more memory than you will save. If you have a
  7.  * large array of such flags however, it becomes worthwhile to store
  8.  * your flags in single bits.
  9.  *
  10.  * Compile command: cc bitarray -fop
  11.  */
  12. #include <stdio.h>
  13.  
  14. #define    NBITS    70        /* Number of bits we need */
  15.  
  16. /*
  17.  * Allocate an array of characters, just large enough to
  18.  * contain the required number of bits.
  19.  */
  20. char bitarray[(NBITS+sizeof(char)-1)/sizeof(char)];
  21.  
  22. /*
  23.  * Set a bit in a bit array
  24.  */
  25. set_bit(b, n)   char b[]; int n;
  26.     { b[n / sizeof(char)] |= 1 << n % sizeof(char); }
  27. /*
  28.  * Clear a bit in a bit array
  29.  */
  30. clear_bit(b, n) char b[]; int n;
  31.     { b[n / sizeof(char)] &= ~(1 << n % sizeof(char)); }
  32. /*
  33.  * Test a bit in a bit array. NOTE: This returns 0/non-zero,
  34.  * if you need 0/1, add '!!' after the 'return'.
  35.  */
  36. test_bit(b, n)  char b[]; int n;
  37.     { return b[n / sizeof(char)] & (1 << n % sizeof(char)); }
  38.  
  39. /*
  40.  * Demonstration program
  41.  */
  42. main()
  43. {
  44.     int i;
  45.     /* First, clear all bits */
  46.     for(i=0; i < NBITS; ++i)
  47.         clear_bit(bitarray, i);
  48.     /* Display the bit string */
  49.     for(i=0; i < NBITS; ++i)
  50.         putc(test_bit(bitarray, i) ? '1' : '0', stdout);
  51.     putc('\n', stdout);
  52.     /* Set every 5'th bit */
  53.     for(i=0; i < NBITS; i += 5)
  54.         set_bit(bitarray, i);
  55.     /* Display the bit string */
  56.     for(i=0; i < NBITS; ++i)
  57.         putc(test_bit(bitarray, i) ? '1' : '0', stdout);
  58.     putc('\n', stdout);
  59.     /* Set all the bits */
  60.     for(i=0; i < NBITS; ++i)
  61.         set_bit(bitarray, i);
  62.     /* Display the bit string */
  63.     for(i=0; i < NBITS; ++i)
  64.         putc(test_bit(bitarray, i) ? '1' : '0', stdout);
  65.     putc('\n', stdout);
  66. }
  67.